package com.yu8home.mapstruct;

import io.github.linpeilie.Converter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 优点：
 * 高性能：MapStruct在编译期间生成类，使用原生的set方法进行赋值，因此效率与手写set方法基本相同。
 * 类型安全：由于MapStruct是编译时的，一旦出现类型或名称不匹配的问题，可以在编译时提前报错，避免了运行时错误。
 * 功能丰富：MapStruct支持深拷贝和指定各种拷贝行为，提供了丰富的功能。
 * 使用简单：用户只需定义接口和拷贝行为，MapStruct会在编译期生成实现类，简化了开发过程。
 * <p>
 * <p>
 * 缺点：
 * 数据移动性：在处理大数据集时，需要将数据从输入节点传输到执行Map和Reduce函数的节点，这可能导致大量的数据移动，消耗时间和网络带宽，成为性能瓶颈。
 * 不适合实时处理：MapStruct是一种离线批处理模型，不适合实时处理需求，通常需要数据集完成后才能输出结果。
 * 需要手动编写Map和Reduce函数：虽然MapStruct简化了部分开发过程，但对于需要处理复杂数据关系和数据连接操作的场景，仍然需要开发人员手动编写Map和Reduce函数。
 * 无法处理复杂的数据关系：MapStruct主要适用于简单的数据处理需求，对于需要处理复杂数据关系和数据连接操作的场景，其能力相对有限。
 * 需要管理分布式计算集群：使用MapStruct时，需要管理分布式计算集群，包括节点的配置、调度和监控等，这增加了开发的复杂性。
 */
@RestController
@Slf4j
public class MapStructController {
    public static int k = 0;

    @GetMapping("/m")
    public String m() {
        Student s = new Student();
        s.setName("沉默的鲨鱼");
        s.setAge(String.valueOf(k++));
        s.setSex("男");

        Converter converter = new Converter();
        Teacher t = converter.convert(s, Teacher.class);

        Teacher f = new Teacher();
        BeanUtils.copyProperties(s, f);// 属性类型不匹配不能copy、嵌套对象与源对象的指针都指向同一对象（浅拷贝）

        return t + "====" + f;
    }

}
